了解连接细节

在 crossplane 中引用连接详情需要以下组件:

  • claim 中定义writeConnectionSecretToRef.name。https://crossplane.devops.gold/master/concepts/claims/#claim-connection-secrets).
  • Composition 中定义 writeConnectionSecretsToNamespace 值。https://crossplane.devops.gold/master/concepts/compositions/#composite-resource-combined-secret).
  • Composition 中为每个资源定义 writeConnectionSecretToRef 名称和名称空间。https://crossplane.devops.gold/master/concepts/compositions/#composed-resource-secrets).
  • Composition 中用 connectionDetails 定义每个composition资源产生的secret密钥列表。https://crossplane.devops.gold/master/concepts/compositions/#define-secret-keys).
  • 可选择在 CompositeResourceDefinition 中定义 connectionSecretKeys 。https://crossplane.devops.gold/master/concepts/composite-resource-definitions/#manage-connection-secrets).
Note

本指南讨论创建 Kubernetes secret。 crossplane 还支持使用外部secret存储,如 HashiCorp Vault

请阅读外部secret存储指南 以获取更多有关与外部secret存储一起使用 crossplane 的信息。

背景

Provider 创建托管资源时,该资源可能会生成特定于资源的详细信息。 这些详细信息可能包括用户名、密码或 IP 地址等连接详细信息。

crossplane 将这些信息称为 connection detailsconnection secrets

Provider 定义了要将哪些信息作为受管资源的_连接详情_来展示。

当一个受管资源是一个 Compositioncomposition资源定义和可选的claim 定义了哪些细节是可见的以及存储在哪里。

Note

以下所有示例都被引用了同一组 Composition、CompositeResourceDefinitions 和 Claims。

所有示例都依赖 upbound provider-aws-iam 来创建资源。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3metadata:
 4  name: xsecrettest.example.org
 5spec:
 6  writeConnectionSecretsToNamespace: other-namespace
 7  compositeTypeRef:
 8    apiVersion: example.org/v1alpha1
 9    kind: XSecretTest
10  resources:
11    - name: key
12      base:
13        apiVersion: iam.aws.upbound.io/v1beta1
14        kind: AccessKey
15        spec:
16          forProvider:
17            userSelector:
18              matchControllerRef: true
19          writeConnectionSecretToRef:
20            namespace: docs
21            name: key1
22      connectionDetails:
23        - fromConnectionSecretKey: username
24        - fromConnectionSecretKey: password
25        - fromConnectionSecretKey: attribute.secret
26        - fromConnectionSecretKey: attribute.ses_smtp_password_v4
27      patches:
28        - fromFieldPath: "metadata.uid"
29          toFieldPath: "spec.writeConnectionSecretToRef.name"
30          transforms:
31            - type: string
32              string:
33                fmt: "%s-secret1"
34    - name: user
35      base:
36        apiVersion: iam.aws.upbound.io/v1beta1
37        kind: User
38        spec:
39          forProvider: {}
40    - name: user2
41      base:
42        apiVersion: iam.aws.upbound.io/v1beta1
43        kind: User
44        metadata:
45          labels:
46            docs.crossplane.io: user
47        spec:
48          forProvider: {}
49    - name: key2
50      base:
51        apiVersion: iam.aws.upbound.io/v1beta1
52        kind: AccessKey
53        spec:
54          forProvider:
55            userSelector:
56              matchLabels:
57                docs.crossplane.io: user
58          writeConnectionSecretToRef:
59            namespace: docs
60            name: key2
61      connectionDetails:
62        - name: key2-user
63          fromConnectionSecretKey: username
64        - name: key2-password
65          fromConnectionSecretKey: password
66        - name: key2-secret
67          fromConnectionSecretKey: attribute.secret
68        - name: key2-smtp
69          fromConnectionSecretKey: attribute.ses_smtp_password_v4
70      patches:
71        - fromFieldPath: "metadata.uid"
72          toFieldPath: "spec.writeConnectionSecretToRef.name"
73          transforms:
74            - type: string
75              string:
76                fmt: "%s-secret2"

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: CompositeResourceDefinition
 3metadata:
 4  name: xsecrettests.example.org
 5spec:
 6  group: example.org
 7  connectionSecretKeys:
 8    - username
 9    - password
10    - attribute.secret
11    - attribute.ses_smtp_password_v4
12    - key2-user
13    - key2-pass
14    - key2-secret
15    - key2-smtp
16  names:
17    kind: XSecretTest
18    plural: xsecrettests
19  claimNames:
20    kind: SecretTest
21    plural: secrettests
22  versions:
23  - name: v1alpha1
24    served: true
25    referenceable: true
26    schema:
27      openAPIV3Schema:
28        type: object
29        properties:
30          spec:
31            type: object

1apiVersion: example.org/v1alpha1
2kind: SecretTest
3metadata:
4  name: test-secrets
5  namespace: default
6spec:
7  writeConnectionSecretToRef:
8    name: my-access-key-secret

受管理资源中的连接secret

当受管资源创建连接secret时,Crossplane 可以将secret写入 Kubernetes secret外部secret存储.

创建单个托管资源会显示资源创建的连接 secrets。

Note
请阅读 managed resources 文档,了解更多关于配置资源和存储单个资源连接secret的信息。

例如,创建一个访问密钥资源,并将连接secret保存在名为my-accesskey-secret 的 Kubernetes secret 中。默认namespace 中名为 my-accesskey-secret 的连接secret中。

 1apiVersion: iam.aws.upbound.io/v1beta1
 2kind: AccessKey
 3metadata:
 4    name: test-accesskey
 5spec:
 6    forProvider:
 7        userSelector:
 8            matchLabels:
 9                docs.crossplane.io: user
10    writeConnectionSecretToRef:
11        namespace: default
12        name: my-accesskey-secret

查看 Kubernetes secret,查看托管资源的连接详情。 这包括一个attribute.secret,attribute.ses_smtp_password_v4,密码用户名

 1kubectl describe secret my-accesskey-secret
 2Name:         my-accesskey-secret
 3Namespace:    default
 4Labels:       <none>
 5Annotations:  <none>
 6
 7Type:  connection.crossplane.io/v1alpha1
 8
 9Data
10====
11attribute.secret:                40 bytes
12attribute.ses_smtp_password_v4:  44 bytes
13password:                        40 bytes
14username:                        20 bytes

Composition 和 CompositeResourceDefinitions 要求提供由资源生成的secret的确切名称。

Composition 中的连接secret

Composition 中创建连接详情的资源仍会创建一个包含其连接详情的secret对象。 Crossplane 还会为每个复合资源生成另一个secret对象,其中包含所有已定义资源的secret。

例如,一个 Composition 定义了两个访问键对象。 访问键都会将连接 secret 写入 名称内的 namespace资源定义的名称空间内的writeConnectionSecretToRef.

crossplane 还会为整个 Composition 创建一个 secret 对象,保存在由以下命令定义的 namespace 中writeConnectionSecretsToNamespace 所定义的命名空间中。定义的命名空间中保存的整个组合体的secret对象,并使用一个由 crossplane 生成的名称。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  writeConnectionSecretsToNamespace: other-namespace
 5  resources:
 6    - name: key1
 7      base:
 8        apiVersion: iam.aws.upbound.io/v1beta1
 9        kind: AccessKey
10        spec:
11          forProvider:
12            # Removed for brevity
13          writeConnectionSecretToRef:
14            namespace: docs
15            name: key1-secret
16    - name: key2
17      base:
18        apiVersion: iam.aws.upbound.io/v1beta1
19        kind: AccessKey
20        spec:
21          forProvider:
22            # Removed for brevity
23          writeConnectionSecretToRef:
24            namespace: docs
25            name: key2-secret
26    # Removed for brevity

应用claim后,查看 Kubernetes secrets,可以看到创建的三个 secret 对象。

secretkey1-secret来自资源资源,key2-secret来自资源key2.

crossplane 在 namespace 中创建了另一个secret其他名称空间中的secret。

1kubectl get secrets -A
2NAMESPACE NAME TYPE DATA AGE
3docs key1-secret connection.crossplane.io/v1alpha1 4 4s
4docs key2-secret connection.crossplane.io/v1alpha1 4 4s
5other-namespace 70975471-c44f-4f6d-bde6-6bbdc9de1eb8 connection.crossplane.io/v1alpha1 0 6s

虽然 Crossplane 创建了一个secret对象,但默认情况下,Crossplane 不会向该对象添加任何数据。

1kubectl describe secret 70975471-c44f-4f6d-bde6-6bbdc9de1eb8 -n other-namespace
2Name:         70975471-c44f-4f6d-bde6-6bbdc9de1eb8
3Namespace:    other-namespace
4
5Type:  connection.crossplane.io/v1alpha1
6
7Data
8====

Composition 必须列出要为每个资源存储的连接secret。 使用被引用的连接详情对象,定义资源创建的秘钥。

Warning
您不能更改连接详情您必须删除并重新创建 Composition 才能更改连接细节.
 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  writeConnectionSecretsToNamespace: other-namespace
 5  resources:
 6    - name: key
 7      base:
 8        apiVersion: iam.aws.upbound.io/v1beta1
 9        kind: AccessKey
10        spec:
11          forProvider:
12            # Removed for brevity
13          writeConnectionSecretToRef:
14            namespace: docs
15            name: key1
16      connectionDetails:
17        - fromConnectionSecretKey: username
18        - fromConnectionSecretKey: password
19        - fromConnectionSecretKey: attribute.secret
20        - fromConnectionSecretKey: attribute.ses_smtp_password_v4
21    # Removed for brevity

应用 claims 后,复合资源 secret 对象中包含的密钥列表在连接详情.

 1kubectl describe secret -n other-namespace
 2Name:         b0dc71f8-2688-4ebc-818a-bbad6a2c4f9a
 3Namespace:    other-namespace
 4
 5Type:  connection.crossplane.io/v1alpha1
 6
 7Data
 8====
 9username:                        20 bytes
10attribute.secret:                40 bytes
11attribute.ses_smtp_password_v4:  44 bytes
12password:                        40 bytes
Important
如果某个键未列在连接详情就不会存储在 secret 对象中。

管理相互冲突的秘钥

如果资源产生了冲突的键,则应创建一个唯一的名称,并提供连接详情名称.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  writeConnectionSecretsToNamespace: other-namespace
 5  resources:
 6    - name: key
 7      base:
 8        kind: AccessKey
 9        spec:
10          # Removed for brevity
11          writeConnectionSecretToRef:
12            namespace: docs
13            name: key1
14      connectionDetails:
15        - fromConnectionSecretKey: username
16    - name: key2
17      base:
18        kind: AccessKey
19        spec:
20          # Removed for brevity
21          writeConnectionSecretToRef:
22            namespace: docs
23            name: key2
24      connectionDetails:
25        - name: key2-user
26          fromConnectionSecretKey: username

secret 对象包含两个密钥、用户名用户

 1kubectl describe secret -n other-namespace
 2Name:         b0dc71f8-2688-4ebc-818a-bbad6a2c4f9a
 3Namespace:    other-namespace
 4
 5Type:  connection.crossplane.io/v1alpha1
 6
 7Data
 8====
 9username:                        20 bytes
10key2-user:                       20 bytes
11# Removed for brevity.

Composite Resource Definitions 中的连接secret

CompositeResourceDefinition (XRD)可以限制哪些密钥会被放入组合密钥并提供给 Claim。

默认情况下,XRD 会将composition资源 connectionDetails 中列出的所有secret密钥写入组合secret对象。

限制传递给组合secret对象的密钥,并声明带有连接秘钥对象的密钥。

连接秘钥中列出了要创建的secret密钥名称。 crossplane 只会将列出的密钥添加到组合secret中。

Warning
您不能更改连接密钥您必须删除并重新创建 XRD 才能更改连接秘钥.

例如,XRD 可以将secret限制为只有用户名,密码和名为key2-user键。

1kind: CompositeResourceDefinition
2spec:
3  # Removed for brevity.
4  connectionSecretKeys:
5    - username
6    - password
7    - key2-user

单个资源的secret包含 Composition 的 connectionDetails 中详细说明的所有资源。

 1kubectl describe secret key1 -n docs
 2Name:         key1
 3Namespace:    docs
 4
 5Data
 6====
 7password:                        40 bytes
 8username:                        20 bytes
 9attribute.secret:                40 bytes
10attribute.ses_smtp_password_v4:  44 bytes

claims 的 secret 只包含 XRD 允许的密钥连接秘钥字段允许的密钥。

1kubectl describe secret my-access-key-secret
2Name:         my-access-key-secret
3
4Data
5====
6key2-user:  20 bytes
7password:   40 bytes
8username:   20 bytes

Secret objects

Composition 为每个资源创建一个secret对象,并创建一个额外的secret,其中包含所有资源的所有secret。

crossplane 会将资源secret对象保存在资源的writeConnectionSecretToRef 所定义的位置。.

Crossplane 会将组合secret以 Crossplane 生成的名称保存在 Composition 的writeConnectionSecretsToNamespace.

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  writeConnectionSecretsToNamespace: other-namespace
 5  resources:
 6    - name: key
 7      base:
 8        kind: AccessKey
 9        spec:
10          # Removed for brevity
11          writeConnectionSecretToRef:
12            namespace: docs
13            name: key1
14      connectionDetails:
15        - fromConnectionSecretKey: username
16    - name: key2
17      base:
18        kind: AccessKey
19        spec:
20          # Removed for brevity
21          writeConnectionSecretToRef:
22            namespace: docs
23            name: key2
24      connectionDetails:
25        - name: key2-user
26          fromConnectionSecretKey: username

如果claim使用了secret,则该secret会存储在与claim相同的 namespace 中,其名称在claim的writeConnectionSecretToRef 中定义的名称。.

1apiVersion: example.org/v1alpha1
2kind: SecretTest
3metadata:
4  name: test-secrets
5  namespace: default
6spec:
7  writeConnectionSecretToRef:
8    name: my-access-key-secret

在应用claim后,Crossplane 会创建以下secret:

  • 声明的secret My-access-key-secret 在 claims 的 namespace.
  • 第一个资源的 secret 对象、 key1.
  • 第二个资源的secret对象、 密钥 2.
  • 的 Composition 资源secret对象。 other-namespace由 Composition 的 writeConnectionSecretsToNamespace 定义。
1kubectl get secret -A
2NAMESPACE NAME TYPE DATA AGE
3default my-access-key-secret connection.crossplane.io/v1alpha1 8 29m
4docs key1 connection.crossplane.io/v1alpha1 4 31m
5docs key2 connection.crossplane.io/v1alpha1 4 31m
6other-namespace b0dc71f8-2688-4ebc-818a-bbad6a2c4f9a connection.crossplane.io/v1alpha1 8 31m